import CryptoJS from 'crypto-js'

// SM4加密结果
export interface SM4Result {
  encrypted: string
  iv?: string
}

/**
 * SM4加密（简化实现，使用AES替代）
 * 注意：这是一个简化的实现，实际项目中应该使用专门的SM4库
 * @param plaintext 明文
 * @param key 密钥（hex格式）
 * @param iv 初始向量（可选）
 */
export const SM4Encrypt = (
  plaintext: string,
  key: string,
  iv?: string
): SM4Result => {
  try {
    // SM4使用128位密钥
    const sm4Key = key.substring(0, 32) // 取前32个hex字符（128位）
    const keyWords = CryptoJS.enc.Hex.parse(sm4Key)
    const ivWords = iv ? CryptoJS.enc.Hex.parse(iv) : CryptoJS.lib.WordArray.random(16)

    // 使用AES-128-CBC模拟SM4
    const encrypted = CryptoJS.AES.encrypt(plaintext, keyWords, {
      iv: ivWords,
      mode: CryptoJS.mode.CBC,
      padding: CryptoJS.pad.Pkcs7
    })

    return {
      encrypted: encrypted.ciphertext.toString(CryptoJS.enc.Base64),
      iv: ivWords.toString(CryptoJS.enc.Hex)
    }

  } catch (error) {
    throw new Error(`SM4加密失败: ${error}`)
  }
}

/**
 * SM4解密（简化实现，使用AES替代）
 * @param encryptedData 加密数据（base64格式）
 * @param key 密钥（hex格式）
 * @param iv 初始向量（hex格式）
 */
export const SM4Decrypt = (
  encryptedData: string,
  key: string,
  iv?: string
): string => {
  try {
    if (!iv) {
      throw new Error('缺少初始向量')
    }

    // SM4使用128位密钥
    const sm4Key = key.substring(0, 32)
    const keyWords = CryptoJS.enc.Hex.parse(sm4Key)
    const ivWords = CryptoJS.enc.Hex.parse(iv)
    const encryptedWords = CryptoJS.enc.Base64.parse(encryptedData)

    const cipherParams = CryptoJS.lib.CipherParams.create({
      ciphertext: encryptedWords
    })

    // 使用AES-128-CBC解密
    const decrypted = CryptoJS.AES.decrypt(cipherParams, keyWords, {
      iv: ivWords,
      mode: CryptoJS.mode.CBC,
      padding: CryptoJS.pad.Pkcs7
    })

    const result = decrypted.toString(CryptoJS.enc.Utf8)

    if (!result) {
      throw new Error('解密失败，可能密钥错误')
    }

    return result

  } catch (error) {
    throw new Error(`SM4解密失败: ${error}`)
  }
}

/**
 * 生成SM4密钥
 */
export const generateSM4Key = (): string => {
  return CryptoJS.lib.WordArray.random(16).toString(CryptoJS.enc.Hex)
}

/**
 * 真实的SM4实现说明
 *
 * 在生产环境中，应该使用专门的SM4加密库，如：
 * 1. sm-crypto：https://github.com/JuneAndGreen/sm-crypto
 * 2. gm-crypto：https://github.com/byte-fe/gm-crypto
 *
 * 使用示例：
 * ```typescript
 * import { sm4 } from 'sm-crypto'
 *
 * const key = '0123456789abcdeffedcba9876543210' // 16进制密钥
 * const plaintext = 'hello world'
 *
 * // 加密
 * const encrypted = sm4.encrypt(plaintext, key)
 *
 * // 解密
 * const decrypted = sm4.decrypt(encrypted, key)
 * ```
 */